package com.siao.component
{
	import com.siao.data.HashMap;
	import com.siao.display.TooltipElement;
	import com.siao.errors.SingletonError;
	
	import flash.display.DisplayObjectContainer;
	
	/**
	 * 提示管理器
	 * @author SiaoLeon
	 */
	public class TooltipsManager
	{
		// -------------------------------------------------------------------------------------------------------- 静态常量
		
		// -------------------------------------------------------------------------------------------------------- 静态变量
		
		private static var _instance:TooltipsManager;
		
		/**
		 * 获取单例对象
		 */
		public static function get instance():TooltipsManager
		{
			if (_instance == null)
			{
				_instance = new TooltipsManager();
			}
			return _instance;
		}
		
		// -------------------------------------------------------------------------------------------------------- 静态方法
		
		// -------------------------------------------------------------------------------------------------------- 静态函数
		
		// -------------------------------------------------------------------------------------------------------- 属性
		
		// -------------------------------------------------------------------------------------------------------- 变量
		
		private var tooltips:HashMap;
		
		// -------------------------------------------------------------------------------------------------------- 构造
		
		/**
		 * 构造函数，单例模式
		 */
		public function TooltipsManager()
		{
			if (_instance != null)
			{
				throw new SingletonError(this);
			}
			_instance = this;
			
			this.init();
		}
		
		// -------------------------------------------------------------------------------------------------------- 方法
		
		/**
		 * 注册提示
		 * @param container 提示容器
		 * @param tooltip 提示类，需继承 Tooltip 类
		 */
		public function register(container:DisplayObjectContainer, tooltip:Class):void
		{
			if (this.tooltips.containsKey(tooltip))
			{
				return;
			}
			
			var instance:* = new tooltip();
			
			if (!(instance is Tooltip))
			{
				throw new TypeError(tooltip + "不是继承 Tooltip 类的有效对象");
			}
			
			(instance as Tooltip).container = container;
			this.tooltips.put(tooltip, instance);
		}
		
		/**
		 * 获取提示
		 * @param tooltip 提示类，需继承 Tooltip 类
		 * @return
		 */
		public function getTooltip(tooltip:Class):Tooltip
		{
			if (!this.tooltips.containsKey(tooltip))
			{
				return null;
			}
			
			return this.tooltips.getValue(tooltip);
		}
		
		/**
		 * 移除提示
		 * @param tooltip 提示类，需继承 Tooltip 类
		 */
		public function remove(tooltip:Class):void
		{
			if (!this.tooltips.containsKey(tooltip))
			{
				return;
			}
			
			this.tooltips.remove(tooltip);
		}
		
		/**
		 * 清除所有提示
		 */
		public function clear():void
		{
			for each (var tooltip:Class in this.tooltips.keys)
			{
				this.remove(tooltip);
			}
		}
		
		/**
		 * 显示指定元素的提示
		 * @param element 提示元素
		 */
		public function show(element:TooltipElement):void
		{
			if (element.tooltip == null)
			{
				return;
			}
			
			var tooltip:Tooltip = this.getTooltip(element.tooltip);
			
			if (tooltip == null)
			{
				return;
			}
			
			tooltip.element = element;
			tooltip.show();
		}
		
		/**
		 * 隐藏指定元素的提示
		 * @param element 提示元素
		 */
		public function hide(element:TooltipElement):void
		{
			if (element.tooltip == null)
			{
				return;
			}
			
			var tooltip:Tooltip = this.getTooltip(element.tooltip);
			
			if (tooltip == null)
			{
				return;
			}
			
			tooltip.element = null;
			tooltip.hide();
		}
		
		// -------------------------------------------------------------------------------------------------------- 函数
		
		/**
		 * 初始化
		 */
		private function init():void
		{
			this.tooltips = new HashMap();
		}
	
	}
}
